######### Makefile COMMON ########
#c 还是 c++
EXTENSION = cpp
#gcc 还是 g++
CC = g++
#生成的可执行文件名
EXE = ./main
#源文件路径 空格 可以继续添如 src src1 src2
SUBDIR = .
#.o文件存放路径
OBJ = build
#.d文件存放路径
DEP = build/dep
 
#预处理选项（要包含的.h文件的路径）
CPPFLAGS += -I /usr/local/include

#链接选项
LDFLAGS += -L/usr/local/lib -lpthread
	
#编译器的选项
CFLAGS += -g -Wall
 
#后面的内容都不需要修改
CXX_SOURCES = $(foreach dir,$(SUBDIR), $(wildcard $(dir)/*.$(EXTENSION)))
CXX_OBJECTS = $(patsubst  %.$(EXTENSION), $(OBJ)/%.o, $(notdir $(CXX_SOURCES)))
DEP_FILES  = $(patsubst  %.$(EXTENSION), $(DEP)/%.d, $(notdir $(CXX_SOURCES)))
# $< 第一个依赖文件的名字


$(EXE): $(CXX_OBJECTS)
	@echo "linking....."
	@$(CC) $(LDFLAGS) $(CFLAGS)  $(CXXFLAGS) $(CXX_OBJECTS) -o $(EXE)
	@echo "link success!"

#自定义补充规则, gnu make 自带的规则库无法推导, 告诉make工具如何生成.o文件
$(OBJ)/%.o: $(SUBDIR)/%.$(EXTENSION)
	@echo $< "is compling into" $@
	@$(CC) -c  $(CPPFLAGS) $< -o $@
	@echo $< "complied successd!"	

# 根据对.c文件的依赖, 生成.d文件
$(DEP)/%.d: $(SUBDIR)/%.$(EXTENSION) 
	@set -e; rm -f $@; \
	$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
	sed 's,\($*\)\.o[ :]*,build/\1.o $@ : ,g' < $@.$$$$ > $@; \
	rm -f $@.$$$$

# 根据.c .d文件的依赖生成.d 以及 .o文件 .d文件说明依赖, 具体的动作由上面地指定
include $(DEP_FILES)

.PHONY:clean
clean:
	@echo $(DEP_FILES)
	@-rm  -f  $(CXX_OBJECTS)  $(DEP_FILES)  $(EXE)
 